From: Juergen Gross Date: Tue, 19 Jul 2016 11:30:43 +0000 (+0200) Subject: xenstore: add explicit memory context parameter to get_parent() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~734 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=f304adbd5e1047b36fb64e98ad400fa17084b9cd;p=xen.git xenstore: add explicit memory context parameter to get_parent() Add a parameter to xenstored get_parent() function to explicitly specify the memory context to be used for allocations. This will make it easier to avoid memory leaks by using a context which is freed soon. When available use a temporary context when calling get_parent(), otherwise mimic the old behavior by calling get_parent() with the same argument for both parameters. Signed-off-by: Juergen Gross Reviewed-by: Wei Liu Acked-by: Ian Jackson --- diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index accca82069..0b22670839 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -517,12 +517,16 @@ static enum xs_perm_type perm_for_conn(struct connection *conn, return perms[0].perms & mask; } -static char *get_parent(const char *node) +/* + * Get name of node parent. + * Temporary memory allocations are done with ctx. + */ +static char *get_parent(const void *ctx, const char *node) { char *slash = strrchr(node + 1, '/'); if (!slash) - return talloc_strdup(node, "/"); - return talloc_asprintf(node, "%.*s", (int)(slash - node), node); + return talloc_strdup(ctx, "/"); + return talloc_asprintf(ctx, "%.*s", (int)(slash - node), node); } /* What do parents say? */ @@ -531,7 +535,7 @@ static enum xs_perm_type ask_parents(struct connection *conn, const char *name) struct node *node; do { - name = get_parent(name); + name = get_parent(name, name); node = read_node(conn, name); if (node) break; @@ -826,7 +830,7 @@ static struct node *construct_node(struct connection *conn, const char *name) const char *base; unsigned int baselen; struct node *parent, *node; - char *children, *parentname = get_parent(name); + char *children, *parentname = get_parent(name, name); /* If parent doesn't exist, create it. */ parent = read_node(conn, parentname); @@ -1046,7 +1050,7 @@ static int _rm(struct connection *conn, struct node *node, const char *name) /* Delete from parent first, then if we crash, the worst that can happen is the child will continue to take up space, but will otherwise be unreachable. */ - struct node *parent = read_node(conn, get_parent(name)); + struct node *parent = read_node(conn, get_parent(name, name)); if (!parent) { send_error(conn, EINVAL); return 0; @@ -1083,7 +1087,7 @@ static void do_rm(struct connection *conn, struct buffered_data *in) if (!node) { /* Didn't exist already? Fine, if parent exists. */ if (errno == ENOENT) { - node = read_node(conn, get_parent(name)); + node = read_node(conn, get_parent(in, name)); if (node) { send_ack(conn, XS_RM); return;